// axios封装 请求拦截、响应拦截、错误统一处理
import _axios from 'axios';
//import router from '../router';
import store from '../../store';
import msg from '../../msg';
//import qs from 'qs';

//console.log('环境变量:',process.env.NODE_ENV)
//console.log('环境配置信息:',process.env)
//console.log('自定义环境变量:',process.env.VUE_APP_CST_ENV)

//axios api域名
console.log(window.cfg)
let _apiBaseUrl = window.cfg.baseUrl;

// 根据环境变量名称决定用什么域名
/* if (process.env.NODE_ENV === 'production') {
    _apiBaseUrl = ''; // 生产环境的API基础域名
    /*
    注意：在“项目说明” 文档里面有提到， 凡是使用build命令的任何自定义环境，其NODE_ENV的值只能用production，所以不能用 process.env.NODE_ENV 来判断环境。
    你要自定义一个环境变量，比如 VUE_APP_CST_ENV ，判断环境：
    if (process.env.VUE_APP_CST_ENV === 'test') {
        _apiBaseUrl = 'http://test.xxx.com';
    }
     
}  */

//如果是在环境配置文件里面配置了API地址，直接这样调用：
//_apiBaseUrl = process.env.VUE_APP_API_BASE_URL;



const toLogin = () => {
    console.log('去登录')
    /*router.replace({
        path: '/login',
        query: {
            redirect: router.currentRoute.fullPath
        }
    });*/
}

// 请求失败后的错误统一处理
const errorHandle = (status, result) => {
    // 状态码判断
    switch (status) {
        // 401: 未登录状态，跳转登录页
        case 401:
            msg.alert.error('未登录，请先登录', '未登录', () => {
                toLogin()
            })
            break;
        // 403 token过期 清除token并跳转登录页
        case 403:
            sessionStorage.removeItem(window.consts.strings.adminToken);
            store.commit('loginSuccess', null);
            msg.alert.error('登录已过期，请重新登录', '未登录', () => {
                toLogin();
            })
            break;
        // 404请求不存在
        case 404:
            msg.alert.info('请求的资源不存在')
            break;
        default:
            console.log('================= ERROR ===============');
            console.log(result);
            console.log('=============== END ERROR =============');
    }
}
// 创建axios实例
var instance = _axios.create({
        baseURL: _apiBaseUrl,
        //headers: {'X-Custom-Header': 'foobar'},
        timeout: 1000 * 60 * 200
    }
); //2分钟
//instance.defaults.headers['Content-Type'] = 'application/json';
//instance.defaults.headers.post['Content-Type'] = 'text/plain';

/*instance.defaults.transformRequest = [function (data) {
	// 数据序列化  请求前的处理
	return JSON.stringify(data)
}]*/

// 设置post请求头
/*instance.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
instance.defaults.headers['Content-Type'] = 'application/json';*/
/*instance.defaults.transformRequest = [function (data) {
	// 数据序列化  请求前的处理
	return JSON.stringify(data)
}]*/

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token
 */
instance.interceptors.request.use(
    config => {
        //console.log(config.headers)
        const token = sessionStorage.getItem(window.consts.strings.adminToken);
        //token && (config.headers.Authorization = 'bearer ' + token);
        //config.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
        config.headers.post['token'] = sessionStorage.getItem(window.consts.strings.userToken);
        if (!config.headers['Content-Type']) {
            //if ('multipart/form-data' !== config.headers['Content-Type']) {
            /*config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
            config.data = qs.stringify(config.data, { arrayFormat: 'brackets' });*/
            /*
                qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })
                // 'a[0]=b&a[1]=c'
                qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })
                // 'a[]=b&a[]=c'
                qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })
                // 'a=b&a=c'
            */

            //}
        }
        return config;
    },
    error => Promise.error(error))

// 响应拦截器
instance.interceptors.response.use(
    // 请求成功
    res => {
        if (res.data.code === 401) {
            console.log('登录失效了')
            location.href = '/';
        }
        //console.log('data:',res.data)
        return Promise.resolve(res.data);
    }, //res.status === 200 ? Promise.resolve(res.data) : Promise.reject(res),
    // 请求失败
    error => {
        const {response} = error;
        if (response) {
            console.log(response)
            // 请求已发出，但是不在2xx的范围
            errorHandle(response.status, response.data);
            return Promise.reject(response);
        } else {
            // 处理断网的情况
            // eg:请求超时或断网时，更新state的network状态
            // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
            // 关于断网组件中的刷新重新获取数据，会在断网组件中说明
            //store.commit('changeNetwork', false);
            alert('连接超时')
        }
    });

//export default instance;
export const axios = instance;
export const baseURL = _apiBaseUrl;
